package org.jsola.contract.service;

import org.jsola.contract.dao.IPartySignDAO;
import org.jsola.contract.dto.PartySignAddDTO;
import org.jsola.contract.dto.PartySignUpdateDTO;
import org.jsola.contract.entity.PartySignDO;
import org.jsola.contract.query.PartySignQuery;
import org.jsola.contract.vo.PartySignAccountVO;
import org.jsola.contract.vo.PartySignListVO;
import org.jsola.contract.vo.PartySignVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 合同签署方签署记录
 *
 * @author JanusMix
 */
public interface IPartySignService extends IService<IPartySignDAO, PartySignDO> {

    /**
     * 新增合同签署方签署记录
     * @param partySignAddDTO 新增合同签署方签署记录DTO
     * @param tokenUser 当前用户
     * @return 合同签署方签署记录详情信息
     */
    PartySignVO save(PartySignAddDTO partySignAddDTO, TokenUser tokenUser);

    /**
     * 批量新增合同签署方签署记录
     * @param partySignAddDTOList 新增合同签署方签署记录DTO
     * @param tokenUser 当前用户
     * @return 合同签署方签署记录详情信息
     */
    List<PartySignVO> batchSave(List<PartySignAddDTO> partySignAddDTOList, TokenUser tokenUser);

    /**
     * 修改合同签署方签署记录
     * @param partySignUpdateDTO 修改合同签署方签署记录DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(PartySignUpdateDTO partySignUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除合同签署方签署记录，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param partySignIds 合同签署方签署记录id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long...partySignIds);

    /**
     * 根据合同签署方签署记录id查找
     * @param partySignId 合同签署方签署记录id
     * @param siteId 所属站点id
     * @return 合同签署方签署记录详情信息
     */
    PartySignVO selectById(Long partySignId, String siteId);

    /**
     * 查询合同签署方签署记录
     * @param partySignQuery 查询条件
     * @param siteId 所属站点id
     * @return 合同签署方签署记录列表信息
     */
    List<PartySignListVO> select(PartySignQuery partySignQuery, String siteId);

    /**
    * 查询合同签署方签署记录记录数
    * @param partySignQuery 查询条件
    * @param siteId 所属站点id
    * @return 合同签署方签署记录记录数
    */
    int selectCount(PartySignQuery partySignQuery, String siteId);

    /**
     * 分页查询合同签署方签署记录
     * @param partySignQuery 查询条件
     * @param siteId 所属站点id
     * @return 合同签署方签署记录列表信息
     */
    Page<PartySignListVO> selectPage(PartySignQuery partySignQuery, String siteId);


    /**
     * 根据合同签署方签署记录id查找
     * @param partySignId 合同签署方签署记录id
     * @param siteId 所属站点id
     * @return 合同签署方签署记录
     */
    PartySignDO selectDOById(Long partySignId, String siteId);

    /**
     * 查询合同签署方签署记录
     * @param partySignQuery 查询条件
     * @param siteId 所属站点id
     * @return 合同签署方签署记录列表
     */
    List<PartySignDO> selectDO(PartySignQuery partySignQuery, String siteId);

    /**
     * 根据账户和合同id查询签署方对象
     *
     * @param contractId 合同id
     * @param accountId 账户id
     * @param siteId 站点id
     * @return 签署方对象
     */
    PartySignDO selectByContractParty(Long contractId, String accountId, String siteId);

    /**
     * 查询账户签署的多个合同的签署方记录，不过滤siteId
     *
     * @param contractIdList 合同id列表
     * @param accountId 账户id
     * @return 签署方list
     */
    List<PartySignDO> selectAccountContractListWithNoSiteId(List<Long> contractIdList, String accountId);

    /**
     * 查询签署方的所有合同
     *
     * @param accountId 账户id
     * @param siteId 站点id
     * @return 签署方DO列表
     */
    List<PartySignDO> selectByAccountId(String accountId, String siteId);

    /**
     * 获取合同签署方账户信息
     *
     * @param contractId 合同id
     * @param siteId 站点id
     * @return list
     */
    List<PartySignAccountVO> selectAccountByContractId(Long contractId, String siteId);

    /**
     * 获取合同的签署方列表
     *
     * @param contractId 合同id
     * @param siteId 站点id
     * @return list
     */
    List<PartySignDO> selectByContractId(Long contractId, String siteId);

    /**
     * 根据合同id删除合同签署方列表
     *
     * @param contractId 合同id
     * @param tokenUser  当前用户
     */
    void deleteByContractId(Long contractId, TokenUser tokenUser);

    /**
     * 根据合同id删除合同签署方列表
     *
     * @param contractIds 合同id
     * @param tokenUser  当前用户
     */
    void deleteByContractIds(List<Long> contractIds, TokenUser tokenUser);

    /**
     * 根据账户id查询合同签署方签署记录
     * @param accountId 账户id
     * @return page
     */
    List<PartySignListVO> listAllByAccountId(String accountId);

    /**
     * 根据签署记录的合同id设置返回信息：合同相关信息
     * @param partySignListVO 签署记录
     */
    void setContractInfo(PartySignListVO partySignListVO);
}


